﻿using InterviewAppPhone.QuizPhoneService;
using LibQuestionIsPhone.Models;
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace InterviewAppPhone.ViewModels
{
    public class SchermataPrincipaleViewModel : BaseViewModel, INotifyPropertyChanged
    {
        public event EventHandler CarcamentoCompletato_Event;

        public ObservableCollection<Funzionalita> ListaPulsanti { get; set; }

        private Funzionalita _funzionalitaScelta;

        public Funzionalita FunzionalitaScelta
        {
            get { return _funzionalitaScelta; }
            set
            {
                _funzionalitaScelta = value;
                OnPropertyChanged("FunzionalitaScelta");
            }
        }



        public SchermataPrincipaleViewModel()
        {
            ListaPulsanti = new ObservableCollection<Funzionalita>();

            ListaPulsanti.Add(new Funzionalita() { Nome = "       Nuova Partita      ", Url = "MainPage.xaml" });
            ListaPulsanti.Add(new Funzionalita() { Nome = "       Lista Punteggi     ", Url = "ListaPunteggi.xaml" });
            ListaPulsanti.Add(new Funzionalita() { Nome = "Suggerisci Domanda", Url = "SuggerisciDomanda.xaml" });


        }

        public void LoadData()
        {
            if (IsConnection && !IsDataLoaded)
            {
                IsCalculate = true;
                QuizPhoneService.QuizServiceClient client = new QuizServiceClient();
                client.GetTipologieAndDifficoltaPhoneCompleted += client_GetTipologieAndDifficoltaPhoneCompleted;
                client.GetTipologieAndDifficoltaPhoneAsync(new QuizPhoneService.GetTipologieAndDifficoltaRequest() { Version = 100 });
            }
        }

        private void client_GetTipologieAndDifficoltaPhoneCompleted(object sender, GetTipologieAndDifficoltaPhoneCompletedEventArgs e)
        {
            bool esito = false;
            try
            {
                if (e.Error != null)
                    throw new Exception("Errore nei servizi");

                //TODO gestire nel caso in cui il servizio non torni nulla
                DataFlowObject.ListTipologiaTest = new ObservableCollection<TipologiaTest>();
                Tipologie = new ObservableCollection<TipologiaTest>();
                foreach (var item in e.Result.ListTipologie)
                {
                    var element = new TipologiaTest() { IDTest = item.IdTipologiaTest, NomeTest = item.Descrizione };
                    Tipologie.Add(element);
                    DataFlowObject.ListTipologiaTest.Add(element);
                }
                DataFlowObject.ListDifficolta = new ObservableCollection<Difficolta>();
                foreach (var item in e.Result.ListDifficolta)
                {
                    DataFlowObject.ListDifficolta.Add(new Difficolta()
                    {
                        IDDifficolta = item.IDDifficolta,
                        NumMaxDomande = item.NumMaxDomande,
                        Punteggio = item.Punteggio,
                        TempoMaxDomande = item.TempoMaxDomande,
                        Titolo = item.Titolo
                    });
                }
                DataFlowObject.InfoBacheca = e.Result.InfoBacheca;
                DataFlowObject.Version = e.Result.Version;
                DataFlowObject.IsDatiCaricati = true;
                IsCalculate = false;
                IsDataLoaded = true;
                esito = true;

            }
            catch (Exception ex)
            {
                esito = false;
                TestoErrore = "Errore nel caricamento dei servizi. Ci scusiamo per l'errore. Riprovare in un secondo momento.";
            }
            finally
            {

                if (CarcamentoCompletato_Event != null)
                    CarcamentoCompletato_Event(esito, null);
            }
        }


        public override event PropertyChangedEventHandler PropertyChanged;
        public override void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(name));
        }
    }
}
